/*
* Created on Nov 24, 2004
* Created by dfhuynh
*/
package com.jwmsolutions.jwmscript;
import java.net.URL;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Policy;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
/**
* Lets us grant a set of specified permissions to any URL in a set of specified
* codesources.
*
* @author dfhuynh
*/
public class URLSetPolicy extends Policy {
static private class MyPermissions extends PermissionCollection {
private static final long serialVersionUID = 602331721988458546L;
Permissions m_permissions = new Permissions();
/* (non-Javadoc)
* @see java.security.PermissionCollection#add(java.security.Permission)
*/
public void add(Permission permission) {
m_permissions.add(permission);
}
/* (non-Javadoc)
* @see java.security.PermissionCollection#implies(java.security.Permission)
*/
public boolean implies(Permission permission) {
return m_permissions.implies(permission);
}
/* (non-Javadoc)
* @see java.security.PermissionCollection#elements()
*/
public Enumeration elements() {
return m_permissions.elements();
}
}
private MyPermissions m_permissions = new MyPermissions();
private Policy m_outerPolicy;
private Set m_urls = new HashSet();
/* (non-Javadoc)
* @see java.security.Policy#refresh()
*/
public void refresh() {
if (m_outerPolicy != null) {
m_outerPolicy.refresh();
}
}
/* (non-Javadoc)
* @see java.security.Policy#getPermissions(java.security.CodeSource)
*/
public PermissionCollection getPermissions(CodeSource codesource) {
PermissionCollection pc = m_outerPolicy != null ?
m_outerPolicy.getPermissions(codesource) :
new Permissions();
URL url = codesource.getLocation();
if (url != null) {
String s = url.toExternalForm();
if (m_urls.contains(s) || "file:".equals(s)) {
Enumeration e = m_permissions.elements();
while (e.hasMoreElements()) {
pc.add((Permission) e.nextElement());
}
}
}
return pc;
}
/**
* Sets the outer policy so that we can defer to it for code sources that
* we are not told about.
*
* @param policy
*/
public void setOuterPolicy(Policy policy) {
m_outerPolicy = policy;
}
public void addPermission(Permission permission) {
m_permissions.add(permission);
}
public void addURL(URL ... urls) {
for (URL url : urls) {
m_urls.add(url.toExternalForm());
}
}
}